package futbol.tacticas.concursantes.TacticaSalifo;

import futbol.tacticas.*;
import futbol.tacticas.concursantes.Tactica;

import java.awt.Color;
import java.awt.Point;
import java.util.Vector;
import futbol.General;
import java.util.HashSet;
import java.util.Set;

/**
 *
 * @author salifo
 */
public class TacticaSalifo implements Tactica{
      
     private int nValores[][]={
        {-152,0,6},// Jugador 1
        {-86,60,7},// Jugador 2
        {-115,-20,7},// Jugador 3
        {-110,26,7}, // Jugador 4       
        {-86,-60,7},// Jugador 5
        {-61,1,7},// Jugador 6
        {66,55,7},// Jugador 7
        {62,-45,7},// Jugador 8
        {55,-88,7},// Jugador 9
        {84,4,7},// Jugador 10
        {42,90,9} // Jugador 11
    };
   
    
    
       
    public String getNombre(){
        return "FC EFO";
    }
    
    public Color getColor1(){
        return Color.red;
    }
    
    public Color getColor2(){
        return new Color(230,140,255);
    }
    
    public Color getColorNumero(){
        return Color.blue;
    }
    
    public int getFuerza(int n){
        return nValores[n][2];
    }
    public int getXInicial(int n){
        return nValores[n][0];
    }
    
    public int getYInicial(int n){
        return nValores[n][1];
    }
    

    
 public Vector<Comando> getComandos(SituacionJugadores sj) {
        Vector<Comando> com=new Vector();
        
        Point misJugadores[]=sj.getMisJugadores(); 
        Point contrarios[]=sj.getContrario();  
        
        Set<Integer> jugadoresOcupados = new HashSet<Integer>();
        
        int portero =0;
        Point bola=sj.getBola(); 
        
         //posicionar jugadores
        for (int n=0;n<11;n++)
         com.add(new ComandoIrA(n,nValores[n][0],nValores[n][1]));
        
        
          movPortero(sj,com); 
        
        for (int n=1;n<5;n++){
          int nJC=sj.getContrarioMasCerca(getXInicial(n), getYInicial(n));
          if(contrarios[nJC].getX() < -50){
            jugadoresOcupados.add(new Integer(n));
            com.add(new ComandoIrA(n, contrarios[nJC].getX()+10, contrarios[nJC].getY()));
          }
          if(bola.getY() < 75 && bola.getY() > -75 && bola.getX()< -90 ){
            com.add(new ComandoGolpearBola(portero,60,-120));  
          }
        }
        
      for (int nJug = 6; nJug < 11; nJug++ )
          desmarque(sj,com,bola,misJugadores,contrarios,nJug);
       
      int nJug=sj.getMasCercanoDeBola();
        
      if(bola.getX() <= 0){
        if(bola.getY() > 0){
          for(int n=1;n<11;n++){
            if(nJug != n && !jugadoresOcupados.contains(n)){
                if(nValores[n][0] < 50 && nValores[n][1]  < 0){
                   com.add(new ComandoIrA(n, nValores[n][0] + 15, nValores[n][1] + 10));
                 }else{
                     if(nValores[n][0] < 50){
                        com.add(new ComandoIrA(n, nValores[n][0] + 15, nValores[n][1]));
                      }
                      if(nValores[n][1]  < 0){
                         com.add(new ComandoIrA(n, nValores[n][0], nValores[n][1] + 10));
                       }
                    }
               }
            }
         }
         else{
          for(int n=1;n<11;n++){
           if(nJug != n && !jugadoresOcupados.contains(n)){
             if(nValores[n][0] < 50 && nValores[n][1]  > 0){
                com.add(new ComandoIrA(n, nValores[n][0] + 15, nValores[n][1] - 10));
              }
              else{
               if(nValores[n][0] < 50){
                 com.add(new ComandoIrA(n, nValores[n][0] + 15, nValores[n][1]));
                }
                if(nValores[n][1]  > 0){
                  com.add(new ComandoIrA(n, nValores[n][0], nValores[n][1] - 10));
                }
             }  
           }
         }
        }
          }
        else{
            if(bola.getY() > 0){
                for(int n=1;n<11;n++){
                    if(nJug != n && !jugadoresOcupados.contains(n)){
                        if(nValores[n][0] > 50 && nValores[n][1]  < 0){
                            com.add(new ComandoIrA(n, nValores[n][0] - 15, nValores[n][1] + 10));
                        }else{
                            if(nValores[n][0] > 50){
                                com.add(new ComandoIrA(n, nValores[n][0] - 15, nValores[n][1]));
                            }
                            if(nValores[n][1]  < 0){
                                com.add(new ComandoIrA(n, nValores[n][0], nValores[n][1] + 10));
                            }
                        } 
                    }
                }
            }else{
                for(int n=1;n<11;n++){
                    if(nJug != n && !jugadoresOcupados.contains(n)){                    	
                        if(nValores[n][0] > 50 && nValores[n][1]  > 0){
                            com.add(new ComandoIrA(n, nValores[n][0] - 15, nValores[n][1] - 10));
                        }else{
                            if(nValores[n][0] > 50){
                                com.add(new ComandoIrA(n, nValores[n][0] - 15, nValores[n][1]));
                            }
                            if(nValores[n][1]  > 0){
                                com.add(new ComandoIrA(n, nValores[n][0], nValores[n][1] - 10));
                            }
                        }
                    }
                }
            }
        }

  
        
         //	COLOCO A LOS JUGADORES POR ZONAS
        for(int n=1;n<11;n++){
            if(!jugadoresOcupados.contains(n)){
                if( n==2 || n==4 || n==7 || n==8 ){
                    if(nJug != n){
                        if(bola.getY()< 0){
                            com.add(new ComandoIrA(n, nValores[n][0],bola.getY()));
                        }
                    }
                }
                if( n==3 || n==5 || n==6){
                    if(nJug != n){
                        if(bola.getY() >0){
                            com.add(new ComandoIrA(n, nValores[n][0],bola.getY()));
                        }
                    }
                }
                if( n==1 || n==6 || n==9 ){
                    if(nJug != n){
                        if(bola.getY() > 30){
                            com.add(new ComandoIrA(n, nValores[n][0],bola.getY()));
                        }
                    }
                }
            }
        }
        
        
      
     if(nJug != portero)
      com.add(new ComandoIrA(nJug,bola.getX(), bola.getY()));
      
      mejorPase(sj,com,5);
      mejorPase(sj,com,6);
      
       for (int n=0;n<11;n++)
            com.add(new ComandoTiroAPuerta(n,0));
      return com;
       
}


 
 
 private void mejorPase(SituacionJugadores sj, Vector<Comando> com,int nJugador){
    double mejorDis = 99999;
    int mejorJugador = nJugador;
    Point misJugadores[]=sj.getMisJugadores(); 
    Point contrarios[]=sj.getContrario(); 
    for(int n=nJugador + 1; n < 11; n++){
      if (misJugadores[n].getX() > misJugadores[nJugador].getX() ){
       for(int c=1; c<11; c++){
         double  nDis  = General.getDistancia(misJugadores[n].getX(), misJugadores[n].getY(), contrarios[c].getX(), contrarios[c].getY());
         if(nDis > mejorDis){
           if (misJugadores[n].getX() > misJugadores[nJugador].getX() ){
             mejorJugador=n;
             mejorDis =nDis; 
         }
         }
       }
      }
    }
     if(mejorJugador != nJugador){ 
        com.add(new ComandoPase(nJugador,mejorJugador));
     }
     else
         com.add(new ComandoTiroAPuerta(nJugador,0));
         
     
    }     
  
 
     private void desmarque(SituacionJugadores sj,Vector<Comando> com ,Point bola,Point misJugadores[],Point Contrarios[],int nJug){
       int xBola =(int) bola.getX();  
       int xJugador =(int)misJugadores[nJug].getX();
       int yJugador =(int)misJugadores[nJug].getY();
       int nC = sj.getContrarioMasCerca(xJugador, yJugador);
       int xContrario =(int)Contrarios[nC].getX();
       int yContrario =(int)Contrarios[nC].getY();
       
       if (xJugador >0){
         if( xBola > xJugador) {
             com.add(new ComandoIrA(nJug,xContrario + 10,yContrario));
          }
         else
            com.add(new ComandoIrA(nJug,xContrario - 10,yContrario));
        }
     }
     
  
   
   private void movPortero(SituacionJugadores sj,Vector<Comando> com){
    int portero =0;
    Point bola=sj.getBola();
         
    int jugMasCercanoBola = sj.getMiJugadorMasCerca(bola.getX(), bola.getY());
        
        //Movimiento portero
    //bola en el Area portero
    int y =(int)(bola.getY());
     if (y < -30) y = -30;
     if (y >  30) y =  30;
    if(bola.getY() < 75 && bola.getY() > -75 && bola.getX()< -90 && jugMasCercanoBola == portero){
       
       
       if(y <= 20 && y >= -20 ){
          com.add(new ComandoIrA(portero, nValores[0][0],y));
       }
       else{
        com.add(new ComandoIrA(portero, nValores[portero][0], bola.getY()));
       } 	
    }
    else {
     com.add(new ComandoIrA(portero, nValores[portero][0], y));   
     if(jugMasCercanoBola == portero){
      double distanciaMinimaDeBola = 999999;
      for(int n=1;n<11;n++){
	double distanciaDeBola = sj.getMisJugadores()[n].distance(bola.getX(), bola.getY());
	 if(distanciaDeBola < distanciaMinimaDeBola){
	   distanciaMinimaDeBola = distanciaDeBola;
	    jugMasCercanoBola = n;
	}
      }
      com.add(new ComandoIrA(jugMasCercanoBola, bola.getX(), bola.getY()));
    }
    }
    
 }
}


